// 1️⃣ 引入 async-validator，async-validator 提供了一个构造函数
import Schema from 'async-validator'
import {
  debounce
} from 'miniprogram-licia'
import {
  reqOrderTrade,
  reqGetOrderAddress,
  reqOrderBuy,
  reqSubmitOrder,
  reqWechatPrevPay,
  reqQueryPayStatus
} from '../../../api/order'
import {
  formatTime
} from '../../../utils/formatTime'
Page({
  data: {
    buyName: '', // 订购人姓名
    buyPhone: '', // 订购人手机号
    deliveryDate: '选择送达日期', // 期望送达日期
    blessing: '', // 祝福语
    show: false, // 期望送达日期弹框
    minDate: new Date().getTime(),
    currentDate: new Date().getTime(),
    orderDetail: {},
    addressData: {}
  },
  onLoad(option) {
    console.log(option, 'onloaddetail');
    this.routeParam = {
      ...option
    }
    this.getOrderTrade()
  },
  onShow() {
    this.getOrderAddress()
  },
  // 获取订单详情数据
  async getOrderTrade() {
    const {
      goodsId,
      blessing
    } = this.routeParam
    // 从商品详情页面立即购买入口进来，查询立即购买的商品数据
    if (goodsId) {
      const {
        code,
        data
      } = await reqOrderBuy(goodsId, {
        blessing
      })
      if (code === 200) {
        this.setData({
          orderDetail: data,
          blessing
        })
      }
    } else {
      const {
        code,
        data
      } = await reqOrderTrade()
      if (code === 200) {
        this.setData({
          orderDetail: data
        })
      }
    }
  },
  // 获取订单默认地址
  async getOrderAddress() {
    // 全局有，从全局取地址
    const globalData = getApp().globalData
    const {
      address
    } = globalData
    if (Object.keys(address).length !== 0) {
      this.setData({
        addressData: address
      })
      return
    }
    // 没有走接口查询
    const {
      code,
      data
    } = await reqGetOrderAddress()
    if (code === 200) {
      this.setData({
        addressData: data
      })
    }
  },

  // 选择期望送达日期
  onShowDateTimerPopUp() {
    this.setData({
      show: true
    })
  },

  // 期望送达日期确定按钮
  onConfirmTimerPicker(event) {
    this.setData({
      show: false,
      deliveryDate: formatTime(new Date(event.detail))
    })
  },

  // 期望送达日期取消按钮 以及 关闭弹框时触发
  onCancelTimePicker() {
    this.setData({
      show: false,
      minDate: new Date().getTime(),
      currentDate: new Date().getTime()
    })
  },

  // 跳转到收货地址
  toAddress() {
    wx.navigateTo({
      url: '/modules/settingModule/pages/address/list/index'
    })
  },

  // 提交订单
  submitOrder: debounce(async function () {
    const {
      buyName,
      buyPhone,
      deliveryDate,
      blessing,
      orderDetail,
      addressData
    } = this.data
    const req = {
      cartList: orderDetail.cartVoList,
      buyName,
      buyPhone,
      deliveryDate,
      remarks: blessing,
      userAddressId: addressData.id
    }
    const {
      valid
    } = await this.onValidate(req)

    if (!valid) return

    const {
      code,
      data
    } = await reqSubmitOrder(req)

    if (code === 200) {
      // 存储支付需要的预付单订单编号
      this.orderNo = data
      // 获取预付单信息，支付参数
      this.getWechatPrevPay()
    }
  }, 500),

  // 获取预支付订单信息，支付参数
  async getWechatPrevPay() {
    try {
      const {
        code,
        data
      } = await reqWechatPrevPay(this.orderNo)
      if (code === 200) {
        console.log(data, 'data123123');
        const payInfo = await wx.requestPayment({
          timeStamp: data.timeStamp, // 时间戳，从 1970 年 1 月 1 日 00:00:00 至今的秒数，即当前的时间
          nonceStr: data.nonceStr, // 随机字符串，长度为32个字符以下
          package: data.package, // 统一下单接口返回的 prepay_id 参数值，提交格式如：prepay_id=***
          paySign: data.paySign, // 签名
          signType: data.signType // 签名算法，应与后台下单时的值一致
        })
        console.log(payInfo, 'payInfo');
        const {
          errMsg
        } = payInfo
        if (errMsg === 'requestPayment:ok') {
          // 查询订单的支付状态
          const {
            code,
            message
          } = await reqQueryPayStatus(this.orderNo)
          if (code === 200) {
            wx.redirectTo({
              url: '/pages/order/list/index',
              success: () => {
                wx.flowerTipToast({
                  title: message,
                  icon: 'success'
                })
              }
            })
          }
        }
      }
    } catch (error) {
      wx.flowerTipToast({
        title: '支付遇到问题，请联系客服',
        icon: 'error'
      })
    }
  },

  // 验证提交订单表单数据
  onValidate(params) {
    // 验证收货人，是否只包含大小写字母、数字和中文字符
    const nameRegExp = '^[a-zA-Z\\d\\u4e00-\\u9fa5]+$'

    // 验证手机号，是否符合中国大陆手机号码的格式
    const phoneReg = '^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$'
    // 创建表单验证规则
    const rules = {
      userAddressId: [{
        required: true,
        message: '请选择收货地址'
      }],
      buyName: [{
          required: true,
          message: '请输入收货人姓名'
        },
        {
          pattern: nameRegExp,
          message: '收货人姓名不合法'
        }
      ],
      buyPhone: [{
          required: true,
          message: '请输入收货人手机号'
        },
        {
          pattern: phoneReg,
          message: '收货人手机号不合法'
        }
      ],
      deliveryDate: {
        required: true,
        message: '请选择送达时间'
      }
    }

    // 4️⃣创建表单验证实例
    // 在创建实例时需要传入验证规则
    const validator = new Schema(rules)

    // 5️⃣ 调用 validate 实例方法对数据进行验证
    // validate 方法接收一个对象作为参数，对象是需要验证的数据
    // 注意：validate 方法只会验证和验证规则同名的属性
    if (params.deliveryDate == '选择送达日期') {
      params.deliveryDate = ''
    }
    return new Promise(resolve => {
      validator.validate(params, (errors) => {
        // 如果验证失败，errors 是所有错误的数组
        // 如果验证成功，errors 是 null
        if (errors) {
          wx.flowerTipToast({
            title: errors[0].message,
            icon: 'error'
          })
          resolve({
            valid: false
          })
        } else {
          resolve({
            valid: true
          })
        }

      })
    })
  }
})